//package com.lyt.springboot.controller;
//
//import com.lyt.springboot.annotion.RequestLimit;
//import com.lyt.springboot.annotion.WebLog;
//import com.lyt.springboot.domain.UserData;
//import com.lyt.springboot.service.TestMybatisService;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.PathVariable;
//import org.springframework.web.bind.annotation.RequestParam;
//import org.springframework.web.bind.annotation.RestController;
//
//import java.util.Date;
//import java.util.List;
//import java.util.UUID;
//import java.util.concurrent.TimeUnit;
//
//@RestController
//public class TestController {
//
//    @Autowired
//    private RedisTemplate<String, Object> redisTemplate;
//    @Autowired
//    private TestMybatisService testMybatisService;
//
//    @GetMapping("/v2/testMybatis/{id}")
////    @WebLog(description = "测试自定义注解")
//    public UserData testMybatis(@PathVariable Integer id) {
//        return testMybatisService.testMybatis(id);
//    }
//
//    @RequestLimit(second = 60, maxCount = 3)
//    @GetMapping("/v2/testMybatis")
//    public List<UserData> testMybatis() {
//        return testMybatisService.test();
//    }
//
//    @GetMapping("/v2/test1/{id}")
//    public UserData test1(@PathVariable Integer id) {
//        UserData userData = testMybatisService.test1(id);
//        return userData;
//
//    }
//
//    @GetMapping("/v2/test")
//    public String  testReply() {
//        return "hello 牛牛";
//    }
//
//    public String test() {
//        // time秒内只能访问接口co次
//        int time = 10;
//        int co = 3;
//        Long currentTime = System.currentTimeMillis();
//        redisTemplate.hasKey("limit");
//        Integer count1 = null;
//        Long count = null;
//        if (redisTemplate.hasKey("limit")) {
//            // 方法一
//            count1 = redisTemplate.opsForZSet().rangeByScore("limit", currentTime - time * 1000, currentTime).size();        // intervalTime是限流的时间
//            // 方法二
//            count = redisTemplate.opsForZSet().count("limit", currentTime - time * 1000, currentTime);
//            if (count != null && count > co) {
//                return "error 超出次数";
//            }
//        }
//        redisTemplate.opsForZSet().add("limit", UUID.randomUUID().toString(), currentTime);
//        // 设置过期时间，时长为time的两倍  -----》跨了两个时间片段
//        redisTemplate.expire("limit", time * 2, TimeUnit.SECONDS);
//        return "ok";
//    }
//
//    @GetMapping("/v2/user/{id}")
//    @WebLog(description = "查询用户信息(带缓存)")
//    public UserData getUserWithCache(@PathVariable Integer id) {
//        // 1. 构建缓存key
//        String cacheKey = "user:" + id;
//
//        // 2. 从Redis中获取数据
//        UserData cachedUser = (UserData) redisTemplate.opsForValue().get(cacheKey);
//
//        // 3. 如果缓存中存在，直接返回
//        if (cachedUser != null) {
//            return cachedUser;
//        }
//
//        // 4. 缓存不存在，从数据库查询
//        UserData userData = testMybatisService.testMybatis(id);
//
//        // 5. 如果数据库中存在数据，则存入缓存
//        if (userData != null) {
//            // 设置缓存，过期时间为30分钟
//            redisTemplate.opsForValue().set(cacheKey, userData, 30, TimeUnit.MINUTES);
//        }
//
//        return userData;
//    }
//
//    @GetMapping("/v2/user/clearCache/{id}")
//    @WebLog(description = "清除用户缓存")
//    public String clearUserCache(@PathVariable Integer id) {
//        String cacheKey = "user:" + id;
//        Boolean result = redisTemplate.delete(cacheKey);
//        return result ? "缓存清除成功" : "缓存不存在或清除失败";
//    }
//
//}
